#include "groupmodel.hpp"
#include "db.hpp"

// 创建群组
bool GroupModel::createGroup(Group &group)
{
    char sql[1024] = {0};
    sprintf(sql, "insert into AllGroup (groupname, groupdesc) values ('%s', '%s')", group.getName().c_str(), group.getDesc().c_str());

    MySQL mysql;
    if(mysql.connect())
    {
        if(mysql.update(sql))
        {
            group.setId(mysql_insert_id(mysql.getConnection()));
            return true;
        }
    }

    return false;
}

// 加入群组 ，GroupUser 表 用户id 群id 用户在群的角色
void GroupModel::addGroup(int userid, int groupid, std::string role)
{
    char sql[1024] = {0};
    sprintf(sql, "insert into GroupUser (groupid, userid, grouprole) values ('%d', '%d', '%s')", groupid, userid, role.c_str());

    MySQL mysql;
    if(mysql.connect())
    {
        mysql.update(sql);
    }
}

// 查询用户所在的群组信息，返回所有群以及群成员详细信息
std::vector<Group> GroupModel::queryGroups(int userid)
{
    /**
     * 1. 根据 userid 在 GroupUser 表中查询出该用户所属的群组信息
     * 2. 再根据群组信息，查询属于该群组的所有用户的 userid，并且和 user 表进行多表联合查询，查出用户的详细信息
    */

    char sql[1024] = {0};
    // 查询 userid 所在的所有群的详细信息（组id 组名 组描述）
    sprintf(sql, "select a.id, a.groupname, a.groupdesc from AllGroup a inner join GroupUser b on a.id = b.groupid where b.userid = %d", userid);

    std::vector<Group> groupVec;  // 存了 userid 所在的群组和对应的群组的所有群成员信息

    MySQL mysql;
    if(mysql.connect())
    {
        MYSQL_RES *res = mysql.query(sql);
        if(res != nullptr)
        {
            MYSQL_ROW row;
            // 查到的 userid 所有的群组信息
            while ((row = mysql_fetch_row(res)) != nullptr)
            {
                Group group;
                group.setId(atoi(row[0]));
                group.setName(row[1]);
                group.setDesc(row[2]);
                groupVec.push_back(group);
            }
            mysql_free_result(res);
        }
    }

    // 查询群组的用户信息
    for(Group &group : groupVec)
    {
        // 查 group 群的所有用户，返回这些用户的详细信息
        sprintf(sql, "select a.id, a.name, a.state, b.grouprole from User a inner join GroupUser b on b.userid = a.id where b.groupid = %d", group.getId());

        MYSQL_RES *res = mysql.query(sql);
        if(res != nullptr)
        {
            MYSQL_ROW row;
            // 查到的组员的详细信息
            while ((row = mysql_fetch_row(res)) != nullptr)
            {
                GroupUser groupUser;
                groupUser.setId(atoi(row[0]));
                groupUser.setName(row[1]);
                groupUser.setState(row[2]);
                groupUser.setRole(row[3]);
                // group.getUsers().push_back(groupUser);
                group.setGroupUser(groupUser);
            }
            mysql_free_result(res);
        }
    }

    return groupVec;
}

// 根据指定的 groupid 查询群组用户 id 列表，除了 userid 自己，主要用于群聊业务给群组其它成员群发消息
std::vector<int> GroupModel::queryGroupUsers(int userid, int groupid)
{
    char sql[1024] = {0};
    sprintf(sql, "select userid from GroupUser where groupid = %d and userid != %d", groupid, userid);

    // 返回当前群其它成员 userid
    std::vector<int> idVec;

    MySQL mysql;
    if(mysql.connect())
    {
        MYSQL_RES *res = mysql.query(sql);
        if(res != nullptr)
        {
            MYSQL_ROW row;
            while ((row = mysql_fetch_row(res)) != nullptr)
            {
                idVec.push_back(atoi(row[0]));
            }
            mysql_free_result(res);
        }
    }

    return idVec;
}